package com.example.d6_homework.homework02;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Test {
    public static void main(String[] args) {
        Map<String, Double> globalMap = getGlobalMap();
        Map<String, Double> chinaMap = getChinaMap();

        // 1.打印全球影片排行榜中的前三甲影片名
        // 思路：先对map集合中的值进行排序,然后取前3名即可
        System.out.println("全球影片排行榜的前三甲：");
        // 方法一：
        /*globalMap.entrySet().stream()
                // 根据评分进行降序排序(从大到小排序)
                .sorted(((o1, o2) -> Double.compare(o2.getValue(), o1.getValue())))
                .limit(3) // 只需要前3名
                .map(Map.Entry::getKey) // 将Map.Entry映射成键
                .forEach(System.out::println); // 最后遍历输出*/

        // 方法二：
        globalMap.entrySet().stream()
                // comparingByValue这个是Map.Entry中的一个静态方法
                // 调用这个方法Comparator.reverseOrder(),就会帮助我们将值进行倒序排序
                .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
                .limit(3).map(Map.Entry::getKey).forEach(System.out::println);

        // 如果不想根据map的值倒序排序之间调用Map.Entry.comparingByValue()即可
        // globalMap.entrySet().stream().sorted(Map.Entry.comparingByValue()).forEach(System.out::println);

        System.out.println("-----------------------------------------------------");

        // 2.打印华人影片排行榜中倒数5名的影片名
        // 思路：先对map集合的进行升序排序然后取前5个元素即可
        // 方法一
        chinaMap.entrySet().stream().sorted(Map.Entry.comparingByValue()).limit(5).forEach(System.out::println);
        // 方法二：
        // chinaMap.entrySet().stream().sorted(((o1, o2) -> Double.compare(o1.getValue(), o2.getValue()))).limit(5).forEach(System.out::println);
        // 上面的简化写法
        // chinaMap.entrySet().stream().sorted(Comparator.comparingDouble(Map.Entry::getValue)).limit(5).forEach(System.out::println);

        System.out.println("-----------------------------------------------------");

        // 3.将两个排行榜中的前5名挑出来共同存入新的集合
        // 4.定义电影Film类(属性：电影名,评分),将上面新集合中的数据,封装到Film对象中
        // 分别取出两个排行版的前五名找出来,然后合并成一个流,最后封装数据到Film对象中
        List<Film> topFilms = Stream.concat(
                        // Map.Entry.comparingByValue(Comparator.reverseOrder())使用这种方式进行倒序排序,然后获取前5名的元素
                        chinaMap.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).limit(5),
                        globalMap.entrySet().stream().sorted(((o1, o2) -> Double.compare(o2.getValue(), o1.getValue()))).limit(5))
                .map(entry -> new Film(entry.getKey(), entry.getValue())).collect(Collectors.toList());
        topFilms.forEach(System.out::println);
    }

    /**
     * 获取全球影片的数据
     *
     * @return 全球影片的数据
     */
    public static Map<String, Double> getGlobalMap() {
        Map<String, Double> globalMap = new HashMap<>();
        globalMap.put("肖生克的救赎", 9.7);
        globalMap.put("霸王别姬", 9.6);
        globalMap.put("阿甘正传", 9.6);
        globalMap.put("辛德勒的名单", 9.6);
        globalMap.put("美丽人生", 9.5);
        globalMap.put("千与千寻", 9.4);
        globalMap.put("泰坦尼克号", 9.4);
        globalMap.put("这个杀手不太冷", 9.4);
        globalMap.put("忠犬八公的故事", 9.4);
        globalMap.put("盗梦空间", 9.3);
        return globalMap;
    }

    /**
     * 获取中国的影片数据
     *
     * @return 中国的影片
     */
    public static Map<String, Double> getChinaMap() {
        Map<String, Double> chinaMap = new HashMap<>();
        chinaMap.put("阳光普照", 8.5);
        chinaMap.put("气球", 7.9);
        chinaMap.put("拆弹专家2", 7.9);
        chinaMap.put("一秒钟", 7.8);
        chinaMap.put("送你一朵小红花", 7.5);
        chinaMap.put("金都", 7.7);
        chinaMap.put("叔叔", 7.7);
        chinaMap.put("八佰", 7.6);
        chinaMap.put("夺冠", 7.3);
        chinaMap.put("我和我的家乡", 7.3);
        return chinaMap;
    }
}
